package org.opens.javaskill.neat_code;

import org.junit.Test;

import java.util.Date;

public class NamingStandard {

    /**
     * 说明:
     *      1. 好的命名应该给开发者一种见名知意的感觉,
     *      2. 请牢记: 变量的名字并不像是人一样, 一生只能有一个名字, 变量的名称应该保证最合适:
     *          - 如果感觉一个新名字更合适, 就应该使用idea的refactor-> rename替换掉;
     *          - 现代化构建工具可以帮助我们非常容易的实现这个.
     */
    @Test
    public void test1() {
        // 反例
        Date time = new Date();

        // 正例: 见名知意
        Date startTime = new Date();
    }

    /**
     * 功能:
     *      迭代判断时, 避免魔法值.
     * 说明:
     *      1. 魔法值: 突然出现的值, 除了创建者, 没人知道它是什么意思!!!
     *      2. 合适的变量命名可能会使编码的事件稍微变长, 但是有以下这些好处:
     *          - 提高代码可读性;
     *          - 提高代码可维护性;
     */
    @Test
    public void test2() {
        // 反例: 不明作用的数组声明
        int[] arr = {1, 2, 45, 15, 22, 68, 37};
        // 不明意义的结果声明
        int res = 0;
        for(int x : arr) {
            //此处的18就是一个魔法值, 除了开发者外, 第一眼也可能很多眼之后, 你还是不会了解这个数字的作用./
            if( x >= 18 ) {
                res++;
            }
        }
        System.out.println("成年人的数量为: " + res);

        //正例
        final int ADULT_AGE = 18;
        int[] personAgeArray = { 1, 2, 45, 15, 22, 68, 37 };
        int numberOfAdults = 0;
        for( int personOld : personAgeArray ) {
            //这里将魔法值18替换为了一个常量值, ADULT_AGE 的中文: 成年人的年龄, 即可见名知意.(用翻译软件也可以)
            if( personOld >= ADULT_AGE ) {
                numberOfAdults++;
            }
        }
        System.out.println( "成年人的数量为: " + numberOfAdults );
    }

    /**
     * 说明:
     *      1. 避免使用无用的前缀/后缀:
     *          - 例如你在一个web应用中找一个XxxController, 如果有在controller之后添加Controller的习惯, 就会造成:
     *              1. 你知道了这个文件夹下的所有类都是controller, 所以你会自动或略这个后缀, 所以这个后缀看似是无意义, 但是:
     *                  - web应用的日志系统非常重要, 使用日志可以快速了解应用的问题, 如果没有controller的后缀, 查看日志时就需要看包名去找对应的类.
     *                  - 但是由于所有的controller都会放在com.xxx.controller包下, 似乎后缀又没用了, 所以:
     *                      1. 要么直接不适用后缀/前缀, 将文件直接放在对应的目录下, 做好文件的分类;
     *                      2. 要么使用简化版后缀/前缀:
     *                          - XxxCtl            #参考linux的SystemCtl指令
     *                          - XxxSer            #service接口的缩写后缀
     *                          - XxxSerI           #service接口的实现类后缀.
     *                          - XxxDao/XxxRep     #dao层可以延用
     *                          - pojo类依旧
     *                          - XxxUtil/XxxUtils  #不需要使用简化后缀, 并且这个后缀是必须的, 用来提示开发者
     */
    @Test
    public void test3() {
        //前后缀说明
    }

}
